package cn.demoncat.util.web.entity;

import cn.demoncat.util.lang.MapUtil;
import cn.demoncat.util.lang.StringUtil;
import cn.demoncat.util.web.HeaderUtil;
import cn.demoncat.util.web.UrlUtil;
import cn.demoncat.util.web.constant.HttpConstant;
import cn.demoncat.util.web.constant.HttpConstant.Method;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * HTTP请求参数
 * 
 * @author 延晓磊
 *
 * @since 2020年5月11日
 */
public class HttpParam {

	/**
	 * URL
	 */
	private String url;
	/**
	 * 名称
	 */
	private String name;
	/**
	 * 请求方式  {@link HttpConstant.Method}
	 */
	private String method;
	/**
	 * 请求参数
	 */
	private Map<String, String> params;
	/**
	 * 请求头 {@link HeaderUtil}
	 */
	private Map<String, String> headers;
	/**
	 * Cookies（headers.Cookie）
	 */
	private Map<String, String> cookies;
	/**
	 * 超时时间
	 */
	private Integer timeout;
	/**
	 * 重试次数
	 */
	private Integer times;

	
	public HttpParam(String url, String method) {
		super();
		this.url = UrlUtil.trimHash(url);
		this.method = method;
	}

	public HttpParam() {
		super();
	}

	/**
	 * 获取GET请求
	 * 
	 * @param url		请求地址
	 *
	 * @author 延晓磊
	 *
	 * @since 2020年6月14日
	 */
	public static HttpParam get(String url) {
		return new HttpParam(url, HttpConstant.Method.GET);
	}

	/**
	 * 获取GET请求
	 *
	 * @param url
	 * @param params
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2020年5月11日
	 */
	public static HttpParam get(String url, Map<String, String> params) {
		return get(url, params, null);
	}

	/**
	 * 获取GET请求
	 *
	 * @param url
	 * @param params
	 * @param headers
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2020年5月11日
	 */
	public static HttpParam get(String url, Map<String, String> params, Map<String, String> headers) {
		HttpParam param = new HttpParam();
		param.setUrl(url);
		param.setMethod(Method.GET);
		param.setParams(params);
		param.setHeaders(headers);
		return param;
	}

	/**
	 * 获取POST请求
	 * 
	 * @param url		请求地址
	 *
	 * @author 延晓磊
	 *
	 * @since 2020年6月14日
	 */
	public static HttpParam post(String url) {
		return new HttpParam(url, HttpConstant.Method.POST);
	}

	/**
	 * 获取POST请求
	 *
	 * @param url
	 * @param params
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2020年5月11日
	 */
	public static HttpParam post(String url, Map<String, String> params) {
		return post(url, params, null);
	}

	/**
	 * 获取POST请求
	 *
	 * @param url
	 * @param params
	 * @param headers
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2020年5月11日
	 */
	public static HttpParam post(String url, Map<String, String> params, Map<String, String> headers) {
		HttpParam param = new HttpParam();
		param.setUrl(url);
		param.setMethod(Method.POST);
		param.setParams(params);
		param.setHeaders(headers);
		return param;
	}

	/**
	 * 设置名称
	 *
	 * @param name
	 * @return
	 *
	 * @author 延晓磊
	 * @since 2023年03月29日
	 */
	public HttpParam name(String name){
		this.name = name;
		return this;
	}

	/**
	 * 设置请求方式
	 * 
	 * @param method	HttpConstant.Method
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年6月14日
	 */
	public HttpParam method(String method) {
		this.method = method;
		return this;
	}
	
	/**
	 * 添加请求参数 - 为空时忽略
	 * 
	 * @param key		参数名：已存在则替换
	 * @param value		参数值：为空时忽略，非空时trim
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月13日
	 */
	public HttpParam addParam(String key, String value) {
		// 为空忽略
		if (StringUtils.isBlank(key)) {
			return this;
		}
		// 获取参数集
		if (this.params == null) {
			this.params = new HashMap<>();
		}
		// 覆盖设置
		if (StringUtil.isNotNull(value)) {
			this.params.put(key, value.trim());
		}
		return this;
	}

	/**
	 * 添加请求参数 - 为空时传''
	 *
	 * @param key		参数名：已存在则替换
	 * @param value		参数值：为空时传''，非空时trim
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年10月13日
	 */
	public HttpParam addBlankParam(String key, String value) {
		// 为空忽略
		if (StringUtils.isBlank(key)) {
			return this;
		}
		// 获取参数集
		if (this.params == null) {
			this.params = new HashMap<>();
		}
		// 覆盖设置
		this.params.put(key, StringUtil.trimToEmpty(value));
		return this;
	}

	/**
	 * 添加请求参数 - 为空时忽略
	 * 
	 * @param params	参数名:参数值
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月13日
	 */
	public HttpParam addParam(Map<String, String> params) {
		// 为空忽略
		if (MapUtil.isEmpty(params)) {
			return this;
		}
		// 获取参数集
		if (this.params == null) {
			this.params = new HashMap<>();
		}
		// 覆盖设置
		for (Map.Entry<String, String> entry : params.entrySet()) {
			if (StringUtil.isNotNull(entry.getValue())) {
				this.params.put(entry.getKey(), entry.getValue().trim());
			}
		}
		return this;
	}

	/**
	 * 添加请求参数 - 为空时传''
	 *
	 * @param params	参数名:参数值
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年10月13日
	 */
	public HttpParam addBlankParam(Map<String, String> params) {
		// 为空忽略
		if (MapUtil.isEmpty(params)) {
			return this;
		}
		// 获取参数集
		if (this.params == null) {
			this.params = new HashMap<>();
		}
		// 覆盖设置
		for (Map.Entry<String, String> entry : params.entrySet()) {
			this.params.put(entry.getKey(), StringUtil.trimToEmpty(entry.getValue()));
		}
		return this;
	}

	/**
	 * 添加请求头信息
	 * 
	 * @param key		请求头：已存在则替换
	 * @param value		值：为空时忽略，非空时trim
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月13日
	 */
	public HttpParam addHeader(String key, String value) {
		// 参数为空忽略
		if (StringUtils.isBlank(key)) {
			return this;
		}
		// 获取头信息
		if (this.headers == null) {
			this.headers = new HashMap<>();
		}
		// 覆盖添加头信息
		if (StringUtil.isNotNull(value)) {
			this.headers.put(key, value.trim());
		}
		return this;
	}

	/**
	 * 添加请求头信息
	 * 
	 * @param params	请求头:值
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月13日
	 */
	public HttpParam addHeader(Map<String, String> params) {
		// 参数为空忽略
		if (MapUtil.isEmpty(params)) {
			return this;
		}
		// 获取头信息
		if (this.headers == null) {
			this.headers = new HashMap<>();
		}
		// 覆盖设置
		this.headers.putAll(MapUtil.clearNull2(params));
		return this;
	}

	/**
	 * 添加Cookie
	 * 
	 * @param key		Cookie
	 * @param value		值，已存在则替换
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月13日
	 */
	public HttpParam addCookie(String key, String value) {
		// 参数为空忽略
		if (StringUtils.isBlank(key)) {
			return this;
		}
		// 获取头信息
		if (this.cookies == null) {
			this.cookies = new HashMap<>();
		}
		// 覆盖添加头信息
		this.cookies.put(key, StringUtil.trimToEmpty(value));
		return this;
	}

	/**
	 * 添加Cookies
	 * 
	 * @param params	Cookie:值
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月13日
	 */
	public HttpParam addCookie(Map<String, String> params) {
		// 参数为空忽略
		if (MapUtil.isEmpty(params)) {
			return this;
		}
		// 获取头信息
		if (this.cookies == null) {
			this.cookies = new HashMap<>();
		}
		// 覆盖设置
		this.cookies.putAll(MapUtil.clearNull2(params));
		return this;
	}

	/**
	 * 超时时间
	 * 
	 * @param timeout
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年6月14日
	 */
	public HttpParam timeout(Integer timeout) {
		this.timeout = timeout;
		return this;
	}
	
	/**
	 * 重试次数
	 * 
	 * @param times
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年6月14日
	 */
	public HttpParam times(Integer times) {
		this.times = times;
		return this;
	}
	
	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = UrlUtil.trimHash(url);
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Map<String, String> getParams() {
		return params;
	}

	public void setParams(Map<String, String> params) {
		this.params = params;
	}

	public Map<String, String> getHeaders() {
		return headers;
	}

	public void setHeaders(Map<String, String> headers) {
		this.headers = headers;
	}

	public String getMethod() {
		return method;
	}

	public void setMethod(String method) {
		this.method = method;
	}

	public Map<String, String> getCookies() {
		return cookies;
	}

	public void setCookies(Map<String, String> cookies) {
		this.cookies = cookies;
	}

	public Integer getTimeout() {
		return timeout;
	}

	public void setTimeout(Integer timeout) {
		this.timeout = timeout;
	}

	public Integer getTimes() {
		return times;
	}

	public void setTimes(Integer times) {
		this.times = times;
	}
}
